package main

import "fmt"

// go中没有类的概念
// go可以给类型（结构体，自定义类型）定义方法
// 方法就是定义了接收者的函数
// 接收者的概念类似于其他语言中的this或者self

/*
	func (接收者变量 接收者类型) 方法名(参数列表)(返回参数) {
		函数体
	}
*/

// 接收者变量可以是结构体类型，也可以是结构体指针类型
// 当接收者变量是结构体指针类型时，才能在函数体中正确的对结构体进行修改
// golang中结构体实例时独立的

// Person 人结构体。
type Person struct {
	Name   string
	Age    int
	Sex    string
	height int
}

// MyInt 自定义整型
type MyInt int

// PrintInfo 打印姓名。
func (p Person) PrintInfo() {
	fmt.Printf("姓名：%v", p.Name)
}

// SetInfo2 错误修改结构体
func (p Person) SetInfo2(name string, age int) {
	fmt.Printf("%v %T %p\n", p, p, &p)
	p.Name = name
	p.Age = age
}

// SetInfo 正确修改结构体
func (p *Person) SetInfo(name string, age int) {
	fmt.Printf("%v %T %p\n", p, p, p)
	p.Name = name
	p.Age = age
}

// 除了机构体，还可以给自定义类型定义方法
func (m MyInt) printInfo() MyInt {
	fmt.Printf("我是自定义类型里面的自定义方法，m的值为:%v\n", m)
	m = 11
	return m
}

func main() {
	// 结构体是值类型

	var p1 = Person{
		Name: "张三",
		Age:  20,
		Sex:  "man",
	}
	p1.SetInfo("李四", 34)
	fmt.Printf("%v %T %p\n", p1, p1, &p1)

	var a MyInt = 10
	a = a.printInfo()
	fmt.Println(a)
}
